plinstrument:
{
calc:"
// based on Color STRIKE M

#include	hsv
#include	o_tilt
#include	o_dimmer
#include	o_shutter
#include	o_color
#include	o_pix


// controls
cMod;
cDim; cEfc; cStb; cDur; cTlt; cSpd; cR; cG; cB; cBDm; cCol; cCPr; cWPr; cPgs; cPix; cBPx;


// parameters
pRTl; pMod;

// constants
kPosY = 0.000;
//kDia = 0.046;
kBaseWid = 0.5;
kBaseDep = 0.128;
kBaseHi = 0.11;
kCenterHi = 0.24;
kZBack = 0.06;
kZFront = -0.044;
kHeadWid = 0.428;
kHeadHi = 0.2;

kPtPixs = 16;	// plate (rgb)
kBmPixs = 8;	// beam (w)


dia_area#	// (area) eq. circle diameter
(
	sqrt($0 / M_PI) * 2
);


// (based on Color STRIKE M)
kPtPwrRatio = 576 * 0.5 / (896 * 0.784);	// [W/W]
kBmPwrRatio = 144 * 5   / (432 * 1.56);		// [W/W]

// plate
kPlatDia = dia_area(0.36 * 0.13);
kPlatCnt = 1;
kPlatSpdH = Spread(kPlatCnt, 0.1, 160);
kPlatSpdV = Spread(kPlatCnt, 0.1, 160);
kPlatSrc = kPtPwrRatio * IllumFaceIl(231, 5, kPlatDia, kPlatCnt, kPlatSpdH/*(kPlatSpdH + kPlatSpdV) / 2*/);

// beam
kBeamDia = dia_area(0.36 * 0.02);
kBeamCnt = 1;
kBeamSpdH = Spread(kBeamCnt, 0.1, 138);
kBeamSpdV = Spread(kBeamCnt, 0.1, 100);
kBeamSrc = kBmPwrRatio * IllumFaceIl(1432, 5, kBeamDia, kBeamCnt, kBeamSpdH/*(kBeamSpdH + kBeamSpdV) / 2*/);


// protocol parameters
CENTER[1] = kCenterHi;
PAN;
TILT;
LIGHT;
SHAPE;
CTLS;

PRM=1;
CTL;


// macro

MakePtMacro#
(
	// rgb average 0.5
	p.cPR = 128;
	p.cPG = 128;
	p.cPB = 128;

	@(i < kPtPixs)
	(
		c[i] = p;
		++i;
	);
	c
);

MakeBmMacro#
(
	// w average 0.5
	p.cPD = 128;

	@(i < kBmPixs)
	(
		c[i] = p;
		++i;
	);
	c
);

kPtMacro = MakePtMacro();
kBmMacro = MakeBmMacro();

// ctl proxy
_cR; _cG; _cB;
_cPix;
_cBPx;

MacroTime#
(
	Any(pMod, 1, 3)?
	(
		(cCol < 11)?	// no color macro
		(
			_cR = cR;
			_cG = cG;
			_cB = cB;
		)
		:
		(	// (fix white)
			_cR = 255;
			_cG = 255;
			_cB = 255;
		);
	
		(cCPr < 6)?		// no color (plate?) program macro
		(
			(pMod == 1)?
			(
				_cPix = 0;
			)
			:
			(
				_cPix = cPix;
			);
		)
		:
		(
			_cPix = kPtMacro;
		);

		(cWPr < 6)?		// no white (beam?) program macro
		(
			(pMod == 1)?
			(
				_cBPx = 0;
			)
			:
			(
				_cBPx = cBPx;
			);
		)
		:
		(
			_cBPx = kBmMacro;
		);
	)
	:
	(
		_cR = cR;
		_cG = cG;
		_cB = cB;
		_cPix = cPix;
		_cBPx = cBPx;
	);
);


// tilt

gTilt = TiltNew(200);

TiltTime#
(
	TiltSetInv(gTilt, pRTl);
	TiltSetSpeedN(gTilt, CtlN(255, 0, cSpd));
	TiltPos(gTilt, $0, CtlN(0, 256, cTlt))
);


// commmon dimmer

gDimmer = DimmerNew();

DimmerTime#
(
	(pMod == 2)?
	(
		dd = 1;
	)
	:
	(
		dd = cDim / 255;
	);
	DimmerLev(gDimmer, $0, dd);
);


// common shutter
kShutterDur = 1/31;	// (?)

gShutter = ShutterNew(1, 30, kShutterDur);	// (?)

ShutterTime#
(
	(pMod == 2)?
	(
		ShutterOpen(gShutter);	
	)
	:
	(
		(cEfc < 3)?
		(
			ShutterOpen(gShutter);
		)
		:(cEfc < 6)?
		(
			ShutterSetDuty(gShutter, ParamLin(0.01, 0.99, 0, 255, cDur));	// (?)
			ShutterStrobe(gShutter, $0, CtlN(0, 255, cStb));
		)
		:(cEfc < 51)?
		(
			ShutterSetDuration(gShutter, kShutterDur);	// (?)
			ShutterOpening(gShutter, $0, CtlN(0, 255, cStb));
		)
		:(cEfc < 101)?
		(
			ShutterSetDuration(gShutter, kShutterDur);	// (?)
			ShutterClosing(gShutter, $0, CtlN(0, 255, cStb));
		)
		:(cEfc < 151)?
		(
			ShutterPulse(gShutter, $0, CtlN(0, 255, cStb));
		)
		:(cEfc < 201)?	// lightning
		(
			ShutterPulse(gShutter, $0, CtlN(0, 255, cStb));
		)
		:
		(
			ShutterSetDuty(gShutter, ParamLin(0.01, 0.99, 0, 255, cDur));	// (?)
			ShutterStrobeRandom(gShutter, $0, CtlN(0, 255, cStb));
		);
	);
);


// plate rgb, beam w

gPtRGB;		// rgb
gBmDmr;

PtRGBTime#
(
	(pMod == 2)?
	(
	)
	:
	(
		gPtRGB = Vec(_cR / 255, _cG / 255, _cB / 255);
		gBmDmr = cBDm / 255;
	);
);


// plate pix

gPtPix = PixNew(kPtPixs);

PtPixTime#
(
	(pMod < 1)?
	(
	)
	:
	(
		@(i < kPtPixs)
		(
			p = _cPix[i];
			c = Vec(p.cPR / 255, p.cPG / 255, p.cPB / 255);
			PixSet(gPtPix, i, c);
			++i;
		);
	);
);


// beam pix

gBmPix = PixNew(kBmPixs);

BmPixTime#
(
	(pMod < 1)?
	(
	)
	:
	(
		@(i < kBmPixs)
		(
			p = _cBPx[i];
			c = Vec(p.cPD / 255);
			PixSet(gBmPix, i, c);
			++i;
		);
	);
);


// final composition

/* color structure (guess)
Plate (Beam) RGB,W  (Pt)
Pix RGB,W    (Px)

11ch
Pt only

15/71ch
HTP(Pt, Px)

59ch
Px only
*/

gPtCompo = PixNew(kPtPixs);	// (avoid memory alloc)

HTP#	// (c0, c1) c
(
	c0 = $0;
	c1 = $1;

	@(i < 3)
	(
		c[i] = max(c0[i], c1[i]);
		++i;
	);
	c
);

PlateCompo#	// rgb
(
	(pMod < 1)?		// plate rgb only
	(
		c = gPtRGB;
	)
	:(pMod == 2)?	// pix rgb only
	(
		c = PixAverage(gPtPix);
	)
	:
	(
		@(i < kPtPixs)
		(
			c = HTP(gPtRGB, gPtPix.cur[i]);
			PixSet(gPtCompo, i, c);
			++i;
		);
		c = PixAverage(gPtCompo);
	);

	VecScale(c, gDimmer.cur * gShutter.cur * kPlatSrc)
);


kW = Vec(1, 1, 1);

gBmCompo = PixNew(kBmPixs);	// (avoid memory alloc)

BeamCompo#	// rgb
(
	(pMod < 1)?		// plate w only
	(
		c = gBmDmr;
	)
	:(pMod == 2)?	// pix w only
	(
		c = PixAverage(gBmPix);
		c = c[0];
	)
	:
	(
		@(i < kBmPixs)
		(
			c = max(gBmDmr, gBmPix.cur[i][0]);
			PixSet(gBmCompo, i, Vec(c));
			++i;
		);
		c = PixAverage(gBmCompo);
		c = c[0];
	);

	VecScale(kW, c * gDimmer.cur * gShutter.cur * kBeamSrc)
);


// protocol methods

UPDATE#
(
	MacroTime($0);
	dir = TiltTime($0);
	DimmerTime($0);
	ShutterTime($0);
	PtRGBTime($0);
	PtPixTime($0);
	BmPixTime($0);

	PRM?
	(
		cMod = pMod;
		CTLS = 1;

		// setup light (plate)
		l = LIGHT[0];
		l.pos[1] = kPosY;
		l.pos[2] = kZFront;
		l.dia = kPlatDia;
		l.cnt = kPlatCnt;
		l.spdh = kPlatSpdH;
		l.spdv = kPlatSpdV;
		LIGHT[0] = l;

		// setup light (beam)
		l = LIGHT[1];
		l.pos[1] = kPosY;
		l.pos[2] = kZFront;
		l.dia = kBeamDia;
		l.cnt = kBeamCnt;
		l.spdh = kBeamSpdH;
		l.spdv = kBeamSpdV;
		LIGHT[1] = l;
	);

	(dir | PRM)?
	(
		PAN = 0;
		TILT = 90 + gTilt.cur;
		SHAPE = MovingShape(kBaseWid, kBaseHi, kHeadWid, kHeadHi, kZFront, kZBack, kCenterHi, PAN, TILT, kBaseDep);
	);

	(
		c = PlateCompo();
		l = LIGHT[0];
		l.color = c;
		LIGHT[0] = l;

		c = BeamCompo();
		l = LIGHT[1];
		l.color = c;
		LIGHT[1] = l;
	);

	PRM = CTL = 0;
);

";


chmap:
"cDim cEfc cStb cDur cTlt.w cSpd cR cG cB cBDm",
"cDim cEfc cStb cDur cTlt.w cSpd cR cG cB cBDm cCol cCPr cWPr cPgs",
"                    cTlt.w cSpd                                   cPix(cPR cPG cPB)[16] cBPx(cPD)[8]",
"cDim cEfc cStb cDur cTlt.w cSpd cR cG cB cBDm cCol cCPr cWPr cPgs cPix(cPR cPG cPB)[16] cBPx(cPD)[8]";


ctlprop:
{
	ctls:
	{
		id:cBDm;
		name:BeamDim;
		ini:255;
	},
	{
		id:cPR;
		name:R;
	},
	{
		id:cPG;
		name:G;
	},
	{
		id:cPB;
		name:B;
	},
	{
		id:cPD;
		name:Beam;
	},

	{
		id:cEfc;
		name:Effect;
	},
	{
		id:cStb;
		name:Rate;
	},
	{
		id:cDur;
		name:Duration;
	},
	{
		id:cCPr;
		name:Color Prog;
	},
	{
		id:cWPr;
		name:White Prog;
	},
	{
		id:cPgs;
		name:Prog Speed;
	},

	{
		id:cPixs;
		label:Plate;
	},
	{
		id:cBPxs;
		label:Beam;
	};
};


prm:
{
	controls:
	{
		type:check;
		id:pRTl;
		name:"-Tilt";
	},
	{
		type:selector;
		id:pMod;
		name:Mode;
		ini:0;
		items:
		{
			text:11ch;
			value:0;
		},
		{
			text:15ch;
			value:1;
		},
		{
			text:59ch;
			value:2;
		},
		{
			text:71ch;
			value:3;
		};
	};
};

};
